import JSEncrypt from "jsencrypt";
import CryptoJS from "crypto-js";

const py = process.env.VUE_APP_P_Y;
const ry = process.env.VUE_APP_R_Y; //甲
const ipy = process.env.VUE_APP_I_P_Y;
const aKey = CryptoJS.enc.Utf8.parse("chinatowerenergy");
const iv = "abcdef0123456789abcdef0123456789"; // 16字节（128位）长的十六进制字符串

/**
 * 加密
 * @param txt
 * @returns {*}
 */
export function encrypt(txt) {
  // 加密公钥
  const pK = Decrypt(py);
  const encryptor = new JSEncrypt();
  encryptor.setPublicKey(pK); // 设置公钥
  return encryptor.encrypt(txt); // 对需要加密的数据进行加密
}

/**
 * 解密
 * @param txt
 * @returns {*}
 */
export function decrypt(txt) {
  //后端加密公钥对应的解密私钥
  const ryD = Decrypt(ry);
  const encryptor = new JSEncrypt();
  encryptor.setPrivateKey(ryD);
  return encryptor.decrypt(txt);
}

/**
 * iframe 加密
 * @param {*} txt 需要加密的字符串
 * @returns
 */
export function iframeEncrypt(txt) {
  // iframe加密公钥
  const iPK = Decrypt(ipy);
  const encryptor = new JSEncrypt();
  encryptor.setPublicKey(iPK); // 设置公钥
  return encryptor.encrypt(txt); // 对需要加密的数据进行加密
}

/**
 * AES加密 ：字符串 aKey iv
 */
export function Encrypt(word) {
  const srcs = CryptoJS.enc.Utf8.parse(word);
  const encrypted = CryptoJS.AES.encrypt(srcs, aKey, {
    iv: CryptoJS.enc.Hex.parse(iv),
    mode: CryptoJS.mode.CBC, // 使用CBC模式
    padding: CryptoJS.pad.Pkcs7,
  });
  const encryptData = encrypted.ciphertext.toString().toUpperCase();
  // 转为hex格式，转为Base64的字符串，如果转为base64格式，解密的方式就配置不同
  const hexStr = CryptoJS.enc.Hex.parse(encryptData);
  // 将密文转为Base64的字符串
  return CryptoJS.enc.Base64.stringify(hexStr)
    .replace(/\+/g, "-")
    .replace(/\//g, "_");
}

/**
 * AES 解密 ：字符串 aKey iv  返回base64
 *  */
export function Decrypt(ciphertextBase64) {
  const ciphertext = CryptoJS.enc.Base64.parse(
    ciphertextBase64.replace(/-/g, "+").replace(/_/g, "/")
  );
  const decrypted = CryptoJS.AES.decrypt({ ciphertext }, aKey, {
    iv: CryptoJS.enc.Hex.parse(iv), // 使用与加密时相同的IV
    mode: CryptoJS.mode.CBC,
    padding: CryptoJS.pad.Pkcs7,
  });
  return CryptoJS.enc.Utf8.stringify(decrypted);
}
